# -*- coding: utf-8 -*-
# @Time    : 2023/5/9 0009 10:36
# @Author  : zcj
# @File    : Ding_send.py
# @Software : PyCharm
import getopt
# 获取jenkins构建信息和本次报告地址

import os
import sys
import time
import hmac
import hashlib
import base64
import urllib.parse
from datetime import timedelta, datetime

import jenkins  # 安装pip install python-jenkins
import json
import urllib3


# time.sleep(5)


def get_test_case():
    case = getopt.getopt(sys.argv, '-h')
    return [case[1][1], case[1][2], case[1][3]]
    # return 'API-全量应付流程'  # 调试用
    # return 'test_a'  # 调试用


from urllib3.exceptions import InsecureRequestWarning

timestamp1 = str(round(time.time() * 1000))
secret = 'SEC45cce3517cc70e69cc6f8aa7b55cc0bfc5f464e7d07a7bbfce6e43d264d57aba'  # 替换成自己的值
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp1, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
# print(timestamp)
# print(sign)
# 钉钉通知的接口地址
url = f'https://oapi.dingtalk.com/robot/send?access_token=dcf75077d4192eda6e74820b999bc44f1dbfc76386046bc1996714f54861b71f&timestamp={timestamp1}&sign={sign}'  # 钉钉群的token

# 利用python发送钉钉  在钉钉需要点击 查看测试报告的话 就需要把报告发送到服务器 再把地址参数传下面  就去掉jenkins所有操作
# jenkins登录地址
jenkins_url = "http://192.168.61.130:8080/"  # Jenkins地址
# 获取jenkins对象
server = jenkins.Jenkins(jenkins_url, username='admin', password='admin')  # Jenkins登录名 ，密码
# job名称
job = f"/{get_test_case()[2]}/"
job_name = f"/job/{get_test_case()[2]}/"  # Jenkins运行任务名称
# job的url地址
job_url = jenkins_url + job_name
# 获取最后一次构建
job_last_build_url = server.get_info(job_name)['lastBuild']['url']
# 报告地址
report_url = job_last_build_url + 'allure'  # 'allure'为我的Jenkins全局工具配置中allure别名

'''
钉钉推送方法：
读取report文件中"prometheusData.txt"，循环遍历获取需要的值。
使用钉钉机器人的接口，拼接后推送text
'''


def DingTalkSend():
    d = {}
    # 获取项目绝对路径
    # path = os.path.abspath(os.path.dirname((__file__)))
    # 打开prometheusData 获取需要发送的信息
    f = open(f'/root/.jenkins/workspace/{get_test_case()[2]}/allure-report/export/prometheusData.txt',
             'r')  # allure测试数据报告的路径
    for lines in f:
        for c in lines:
            launch_name = lines.strip('\n').split(' ')[0]
            num = lines.strip('\n').split(' ')[1]
            d.update({launch_name: num})
    print(d)
    f.close()
    retries_run = d.get('launch_retries_run')  # 运行总数
    print('运行总数:{}'.format(retries_run))
    status_passed = d.get('launch_status_passed')  # 通过数量
    print('通过数量：{}'.format(status_passed))
    status_failed = d.get('launch_status_failed')  # 不通过数量
    print('失败数量：{}'.format(status_failed))
    pass_re = "%.f%%" % (float(status_passed) / float(retries_run) * 100)
    print("通过率：{}".format(pass_re))


    # 钉钉推送

    con = {"msgtype": "text",
           "text": {
               "content": f"Pytest_Allure_{get_test_case()[2]}自动化脚本执行完成。"
                          "\n测试概述:"
                          "\n运行总数:" + retries_run +
                          "\n通过数量:" + status_passed +
                          "\n失败数量:" + status_failed +
                          "\n通过率:" + pass_re +
                          "\n构建地址：\n" + job_url +
                          "\n报告地址：\n" + report_url
           },
           "at": {
               "atMobiles": [
                   "130xxxxxxxx"  # 如果需要@某人，这里写他的手机号
               ],
               "isAtAll": 1  # 如果需要@所有人，这些写1
           }

           }
    try:
        urllib3.disable_warnings()
        http = urllib3.PoolManager()
        jd = json.dumps(con)
        jd = bytes(jd, 'utf-8')
        http.request('POST', url, body=jd, headers={'Content-Type': 'application/json'})

    except Exception as e:
        print(e)
